<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      function Vue(options) {
        //Vue配置项接受的数据 都是放在实例的_data属性上
        this._data = options.data;

        //数据代理:遍历_data的数据在实例上也存放一份,并且使用存取器属性,操作或获取实例上的这个属性时,其实就是操作或获取_data的属性
        for (const key in this._data) {
          Object.defineProperty(this, key, {
            get() {
              return this._data[key];
            },
            set(value) {
              this._data[key] = value;
            },
          });
        }

        //数据劫持:当_data上的数据被修改或者获取的时候,我们需要做一些其他事情,我们就要把_data的数据全部改为存取器属性
        for (const key in this._data) {
          let oldValue = this._data[key];
          Object.defineProperty(this._data, key, {
            get() {
              // console.log(this);
              return oldValue;
            },
            set(newValue) {
              oldValue = newValue;
            },
          });
        }
      }

      //实例化
      const vm = new Vue({
        data: {
          count: 10,
          name: "xiaowang",
        },
      });
    </script>
  </body>
</html>
